package com.itheima.day15.ZuoYe.ZuoYe2;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

//**训练目标**：掌握java中反射的基本使用
//
//**需求描述**：定义一个标准的JavaBean，名叫Person，包含属性name、age。
//
//        1.使用反射的方式创建一个实例、调用构造函数初始化name、age，
//
//        2.使用反射方式调用setName方法对名称进行设置，不使用setAge方法，直接使用反射方式对age赋值。
//
//        3.使用反射的方式设置age/name的Field
//
//- 获取Person的字节码Class
//- 通过Class获取有参构造方法
//- 调用构造方法，创建Person对象
//- 通过Class获取setName方法对象
//- 执行setName方法对象
//- 通过Class获取age的Field对象
//- 设置属性
public class Test {
    public static void main(String[] args) throws Exception {
        //1.获取Person的字节码Class
        Class<?> aClass = Class.forName("com.itheima.day15.ZuoYe.ZuoYe2.Person");
        //2.通过Class获取无参构造方法
        Constructor<?> constructor = aClass.getConstructor();
        //3.调用构造方法，创建Person对象
        Object person = constructor.newInstance();
        //4.获取setName方法,aClass.getMethod("setName", String.class)中的String.class是setName这个方法需要传入的参数的类型
        Method setName = aClass.getMethod("setName", String.class);
        //5.调用setName方法，方法名+invoke(对象,参数)
        setName.invoke(person, "张三");
        //6.获取age属性
        Field age1 = aClass.getDeclaredField("age");
        //7.调用age属性的setAccessible方法，设置属性可访问
        age1.setAccessible(true);
        //8.调用age属性的set方法，方法名+invoke(对象,参数)
        age1.set(person, 18);
        System.out.println(person);


    }
}
